
int ledpin=13;//指定LED端口 13

//MS5541的引脚
int DAC_nCS  = 12 ;
int DAC_MOSI = 11 ; 
int DAC_SCLK = 10 ; 

void setup()
{
  pinMode(ledpin,OUTPUT);//设置端口13为输出模式
  Serial.begin(115200);//设置串口波特率为115200

  // 
  pinMode(DAC_nCS  ,OUTPUT);
  pinMode(DAC_MOSI ,OUTPUT);
  pinMode(DAC_SCLK ,OUTPUT);
}


int ReadCmd(int *cmd,int *data) ; 
void AD5541_Input_Data(unsigned int value) ; 


int cmd; 
int data;
void loop()
{
  if(0 == ReadCmd(&cmd,&data)  ){
    Serial.println(cmd);
    Serial.println(data);
    delayMicroseconds(10);  //延时 us
	switch(cmd) {
		case(1) : AD5541_Input_Data(data) ; break ;
	}
  }
} 


void AD5541_Input_Data(unsigned int value)
{
	unsigned int i;
	digitalWrite(DAC_nCS,LOW);  //DAC_nCS = 0; 
	
	for(i=0;i<16;i++)
	{
		if(value&0x8000) {
			digitalWrite(DAC_MOSI,HIGH);  
		} else {
			digitalWrite(DAC_MOSI,LOW);  
		}
		value<<=1;
		digitalWrite(DAC_SCLK,HIGH);  
		digitalWrite(DAC_SCLK,LOW);  
	}
	digitalWrite(DAC_MOSI,LOW);
	digitalWrite(DAC_nCS,HIGH);
}

/*********************************************
 * 读取串口指令和数据
 * 要求出口发送过来的数据以c为头，c后为char的命令，d后为int数据，支持-号，e为结束符
 * 如：c12d123e
 * 该函数请尽量放在主函数的循环体中
 * *cmd, *data 的值为转换后的数据
 * 返回值:当接收到的数据满足格式要求，且接收完毕，返回0 ，否则返回1
 ********************************************/
int ReadCmd(int *cmd,int *data){
	char c=0;
	static char uart_cin_cmd = 0;
	static int uart_cin_data = 0;
	static char uart_cin_status = 0;  //接受指令的状态 ，和下一个状态
	static int uart_cin_flag = 1;  //
	int uart_cin_fuhao_valid = 1;   //data符号（+-）有效标志位
	while(Serial.available() > 0)
	{
		c = char(Serial.read());
		// 状态机状态切换  -----  解析数据格式 ------
		switch(c){
			case('c'):uart_cin_status = (uart_cin_status==0)?1:0; uart_cin_cmd = 0;continue; //收到指令帧头 将标志设为1，准备接受 命令
			case('d'):{ //收到数据标志 将会读取数据的符号 + -
				if(uart_cin_status==1){
					uart_cin_status = 2;
					uart_cin_data = 0;
				}  else {
					uart_cin_status = 0;
				}
				continue;
			}
			case('e'):{
				if(uart_cin_status==2){
					uart_cin_status = 0;
					*cmd = uart_cin_cmd;
					*data =uart_cin_flag*uart_cin_data ;
					uart_cin_fuhao_valid = 1;
					uart_cin_flag=1;
					return 0;
				} // 接收到数据接收结束标椎   回到初始状态
			}
			default:break;
		}
		switch(uart_cin_status){
			case(1):{
				if(c>='0'&&c<='9')uart_cin_cmd=10*uart_cin_cmd+(c-'0') ;
				else uart_cin_status = 0;
				break;
			}
			case(2):{
				if(c>='0'&&c<='9')uart_cin_data=10*uart_cin_data+(c-'0') ;
				else if( c=='-' && uart_cin_flag ==1 && uart_cin_fuhao_valid==1 ) { uart_cin_flag = -1;uart_cin_fuhao_valid=0;}
				else uart_cin_status = 0;
				break;
			}
			default:{ //复位
				uart_cin_data = 0;
				uart_cin_flag = 1;
				uart_cin_cmd = 0;
				uart_cin_fuhao_valid=1;
			}
		}
	}
	return 1;
}